/**
 * @file USB_Plug.ino
 * @author fengyuan (1172166786@qq.com)
 * @brief USB插座的固件
 * @date 2021-04-15
 */

/* Blinker平台的宏定义接口 */
#define BLINKER_WIFI                // 使用WiFi控制
#define BLINKER_MIOT_LIGHT          // 以灯的形式接入米家
#define BLINKER_WITHOUT_SSL         // 以非SSL加密通信方式接入

/* 头文件 */
#include <Blinker.h>
#include "hw_gpio.hpp"
#include "hw_led.hpp"

/* 设备参数配置 */
char auth[] = "dca1ec8e4fd3";       // Blinker平台设备号
char ssid[] = "204_IOT";            // WiFi名
char pswd[] = "XUTIANZE19990919";   // WiFi密码

/* 外设对象定义 */
HW_LED  LED(2, false, true);        // 板载LED
HW_GPIO Plug(0, OUTPUT, false);     // 插座继电器通断控制脚

/* BlinkerAPP组件对象定义 */
BlinkerButton Button_ON("btn-on");
BlinkerButton Button_OFF("btn-off");

/**
 * @brief BlinkerAPP中按键的回调函数
 * @param state
 */
void Button_ON_handle(const String &state)
{
    Plug.on();
}
void Button_OFF_handle(const String &state)
{
    Plug.off();
}
/**
 * @brief 米家电源类操作回调函数
 * @param state 
 */
void miot_powerState_handle(const String &state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON)
    {
        Plug.status(true);
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
    }
    else if (state == BLINKER_CMD_OFF)
    {
        Plug.status(false);
        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();
    }
}

/**
 * @brief 米家查询设备状态回调函数
 * @param queryCode 
 */
void miot_query_handle(int32_t queryCode)
{
    BLINKER_LOG("MIOT Query codes: ", queryCode);

    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER:
            BLINKER_LOG("MIOT Query All");
            BlinkerMIOT.powerState(Plug.status() ? "on" : "off");
            BlinkerMIOT.color(0);
            BlinkerMIOT.mode(0);
            BlinkerMIOT.colorTemp(1000);
            BlinkerMIOT.brightness(1);
            BlinkerMIOT.print();
            break;

        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER:
            BLINKER_LOG("MIOT Query Power State");
            BlinkerMIOT.powerState(Plug.status() ? "on" : "off");
            BlinkerMIOT.print();
            break;

        default:
            BLINKER_LOG("MIOT Query Unknown");
            BlinkerMIOT.powerState(Plug.status() ? "on" : "off");
            BlinkerMIOT.color(0);
            BlinkerMIOT.mode(0);
            BlinkerMIOT.colorTemp(1000);
            BlinkerMIOT.brightness(1);
            BlinkerMIOT.print();
            break;
    }
}

/**
 * @brief Arduino库提供的初始化接口
 */
void setup()
{
    Serial.begin(115200);                                   // 初始化串口
    LED.init();                                             // LED初始化
    Plug.init();                                            // 继电器控制引脚初始化

    BLINKER_DEBUG.stream(Serial);                           // 将Blinker库的调试信息定位到串口上
    Blinker.begin(auth, ssid, pswd);                        // 设置设备号、WiFi名、密码
    Button_ON.attach(Button_ON_handle);                     // 注册BlinkerAPP回调函数
    Button_OFF.attach(Button_OFF_handle);
    BlinkerMIOT.attachPowerState(miot_powerState_handle);   // 注册米家电源类操作回调函数
    BlinkerMIOT.attachQuery(miot_query_handle);             // 注册米家询问设备状态回调函数
}

/**
 * @brief Arduino库提供的主循环接口
 */
void loop()
{
    Blinker.run();                                          // 执行Blinker库主函数

    LED.status(Blinker.connected() == false);               // 当与服务器失去连接时，点亮板载的LED
}
